Software Engineering 软件工程

1. 概述

软件工程(Software Engineering)是研究如何以系统化(Systematic)、规范化(Disciplined)、可度量(Quantifiable)的方法,将工程原理应用于软件的开发(Development)、运行(Operation)与维护(Maintenance),以及对这些方法的实证研究的学科。

软件工程解决的核心问题:软件复杂度高、规模大,直接"写代码"会导致进度失控、成本超支、质量低劣——即 1968 年 NATO 会议提出的"软件危机(Software Crisis)"。软件工程的目标是在成本与时间的约束下,交付高质量、可维护、满足真实需求的软件系统。

1.1 软件工程 vs 计算机科学

维度计算机科学(Computer Science)软件工程(Software Engineering)
关注点理论、算法、计算本质工程实践、过程、团队协作、交付
典型问题"这个问题可计算吗?算法复杂度多少?""如何在预算内交付可靠可维护的系统?"
产出理论、原型、论文可运行、可维护、满足需求的软件产品
本质发现"是什么"创造"如何做"
专有名词解释
Software Crisis(软件危机):20 世纪 60 年代,随着软件规模增长,出现进度超期、预算超支、质量失控、维护困难等现象的统称,直接催生了软件工程这门学科。
SRS(Software Requirements Specification,软件需求规格说明书):描述软件系统应具备的功能、行为与约束的正式文档。
SDLC(Software Development Life Cycle,软件开发生命周期):软件从概念到退役所经历的全部阶段。

1.2 软件工程的三支柱

过程、方法、工具三者共同构成软件工程的"工程性"——它不是一门手艺(craft),而是一门有纪律的工程学科。全球公认的权威知识框架是 IEEE 计算机学会发布的 SWEBOK(Software Engineering Body of Knowledge,软件工程知识体系),其最新 V4.0 定义了 18 个知识领域。

1.3 软件完整分类——规范差异的总纲

软件工程的知识体系(SWEBOK)是"公分母",但工程规范不能一刀切:软件分很多类型,面向的用户不同,质量属性优先级、生命周期模型、架构设计依据、编码底线都随之不同。因此软件工程实践的第一步是先给软件分类——分类决定规范。按"用户/消费者 + 运行形态"可把软件完整划分为五类:

类别代表用户/消费者运行形态
底层/系统软件操作系统、驱动、固件、嵌入式、编译器机器 / 硬件直接运行在硬件之上
中间件/基础设施nginx、redis、Kafka、消息队列、容器运行时其他软件系统独立进程,通过协议对外提供服务
开发工具CLI、IDE、CI/CD、包管理器、调试器开发者交互式/脚本化,嵌入开发工作流
框架/库Spring、React、SDK、各类依赖开发者(复用者)代码库,编译/部署期被组装进应用
业务系统/应用软件ERP、电商、OA、行业应用、消费级 App企业用户 / 终端消费者面向具体业务流程与用户界面
分类决定规范:五类的差异最终落到三个问题上——质量属性排第一的是什么(见 5.4)、架构/设计/编码的约束从哪来(见 4.8)、用哪个生命周期模型(见 第 2 章)。后续各章统一按本表的五类顺序展开。

1.4 业务系统开发的本质

业务系统/应用软件(ERP、电商、OA、行业应用、消费级 App)是五类软件中需求量最大的一类,也是绝大多数工程师真正在做的软件。它的本质决定了工程重心不在"造工具",而在组织工具与面向用户,这与底层软件、中间件、开发工具、框架/库有本质区别。

最本质的能力是组合,不是制造:做业务系统,最本质的能力其实是组合利用成熟的开源框架与库——Spring、React、Vue、数据库、消息队列、缓存、云服务、DevOps 平台——来满足业务流程,而不是去重新制造工具。轮子早已造好,工程重点在于选型、组合、编排:正确挑选成熟组件,把它们可靠地拼接、配置、集成起来。
最核心的定位是面向用户,不是开发给开发者:业务系统的价值由最终用户(企业内部人员 / 终端消费者)判定,而不是由开发者判定。它交付的是业务流程的顺畅与用户体验,因此"贴近用户、快速响应业务变化"排在一切技术追求之前——技术只是手段,业务价值才是目的。
AI 时代:业务系统变得极其简单:大模型把"理解需求、生成代码、组合框架、排错调优"的智力成本大幅拉低,业务系统的开发从"技术活"加速变成"业务活"——谁更懂业务、更懂用户,谁就能更快做出业务系统,技术门槛持续下降,竞争力转移到对业务与用户的理解上。

这一判断落到工程规范上,业务系统应:优先复用成熟框架(不重复造轮子)、保持技术栈克制、快速迭代响应业务、重可维护性与测试,对应关系见 4.8 约束来源 与 5.4 质量属性优先级 中"业务系统"一列。

2. 生命周期与过程模型

2.1 软件生命周期模型(Process Models)

模型核心思想适用场景优点/缺点
瀑布模型(Waterfall)需求→设计→实现→测试→部署,阶段严格串行需求明确、稳定的项目(如嵌入式、政府项目)文档规范/变更代价高、反馈晚
V 模型(V-Model)把测试与开发阶段对应起来,强调验证与确认安全关键系统(航天、医疗)测试前置/仍偏串行
迭代/增量模型分多轮迭代交付可运行子集,逐步完善需求不完整、需快速反馈尽早得到可用版本/规划复杂
螺旋模型(Spiral)四象限(目标→风险→开发→评审)循环,风险驱动大型、高风险项目重视风险/成本高、管理重
敏捷(Agile / Scrum)短周期迭代、拥抱变化、持续交付、自组织团队互联网产品、需求频繁变化响应快/文档与整体规划弱
DevOps / 持续交付开发与运维一体化,CI/CD 自动化流水线需要频繁可靠发布的产品发布快、质量稳/基础设施要求高
专有名词解释
Agile(敏捷):基于《敏捷宣言》的一组价值观与方法论,强调个体与互动、可用软件、客户协作、响应变化。
Scrum:最流行的敏捷框架,以 Sprint(固定时长迭代,通常 1-4 周)、站会、评审会、回顾会为节奏。
DevOps:Development(开发)与 Operations(运维)的融合,通过自动化(CI/CD)打通"构建-测试-部署-监控"闭环。
CI(Continuous Integration,持续集成):频繁地把代码合并到主干并自动构建、自动测试。
CD(Continuous Delivery/Deployment,持续交付/部署):让每次通过测试的构建都能随时可靠发布(Delivery 需人工批准,Deployment 全自动)。

2.2 过程框架标准:ISO/IEC/IEEE 12207

ISO/IEC/IEEE 12207 是软件生命周期过程国际标准,把软件工程活动组织为 四组过程:

过程组包含过程说明
协议过程(Agreement)获取(Acquisition)、供应(Supply)客户与供应商之间的契约活动
组织项目使能过程(Organizational)管理、基础设施、过程改进、人力资源、资产管理支撑组织的长期能力
项目过程(Project)规划、评估与控制、风险管理、配置管理、质量保证、度量单个项目的计划与治理
技术过程(Technical)需求定义→需求分析→架构设计→实现→集成→验证→运行→维护真正"做出软件"的核心工程活动

这四组过程的整体结构,详见 7.3 包图。

3. SWEBOK 知识体系

SWEBOK(Software Engineering Body of Knowledge)由 IEEE 计算机学会组织编写,是全球公认的软件工程知识权威框架。V4.0 共 18 个知识领域(Knowledge Area, KA),可分为四类:

类别知识领域核心内容
软件工程核心过程1. Software Requirements 需求需求获取、分析、规格说明、验证与管理
2. Software Architecture 架构系统结构、质量属性、架构决策与文档化
3. Software Design 设计模块划分、设计模式、接口与数据设计
4. Software Construction 构建编码、单元测试、代码评审、编码规范
5. Software Testing 测试测试级别、测试技术、测试管理、缺陷跟踪
软件运营与维护6. Software Engineering Operations 运维部署、监控、容量管理、事件响应(含 DevOps)
7. Software Maintenance 维护缺陷修复、适应性/完善性维护、再工程
8. Software Configuration Management 配置管理版本控制、变更管理、构建管理、发布管理
管理、质量与安全9. Software Engineering Management 管理项目计划、估算、进度、人员与风险管理
10. Software Engineering Process 过程过程定义、过程改进(CMMI、SPICE)
11. Software Engineering Models and Methods 模型与方法UML、形式化方法、模型驱动开发等
12. Software Quality 质量质量模型、质量保证(SQA)、质量度量
13. Software Security 安全威胁建模、安全编码、漏洞管理、安全测试
专业与学科基础14. Software Engineering Professional Practice 专业实践职业道德、团队协作、沟通
15. Software Engineering Economics 经济学成本估算、ROI、价值决策
16. Computing Foundations 计算基础算法、数据结构、操作系统、网络、数据库
17. Mathematical Foundations 数学基础离散数学、概率统计、逻辑
18. Engineering Foundations 工程基础工程建模、度量、试验设计、工程伦理
专有名词解释
Knowledge Area(知识领域):SWEBOK 中划分学科内容的独立主题单元,每个 KA 都有公认的核心概念与参考书目。
CMMI(Capability Maturity Model Integration,能力成熟度模型集成):评估与改进组织过程成熟度(1-5 级)的模型。
SQA(Software Quality Assurance,软件质量保证):通过计划、评审与审计确保软件及过程符合要求的管理活动。

4. 架构·设计·编码的定位与参考资源

软件工程中常被混淆的三个概念——架构设计(Architecture)、详细设计(Design)、编码规范与实现(Construction)——在业界是三个独立的研究层面,分别对应 SWEBOK 中的不同知识领域(KA)。本章厘清它们的边界、归属、代码摆放与职责划分的业界流派,并给出完整参考资料清单。

4.1 三个层面的定位对比

层面关注点决策时机改动成本SWEBOK 归属主要交付物
架构设计(Architecture)系统级结构:模块边界、组件关系、部署、质量属性(性能/安全/可用性)项目早期高,后期极难改KA2 Software Architecture架构文档、ADR、部署图
详细设计(Design)部件内部:类、接口、数据结构、设计模式架构确定后中,模块内可改KA3 Software Design设计文档、类图、接口定义
编码规范与实现(Construction)代码怎么写:命名、目录摆放、职责划分、lint、测试习惯每日开发低,随时可改KA4 Software Construction源码、单元测试、编码规范
专有名词解释
ADR(Architecture Decision Record,架构决策记录):以"背景-决策-后果"三段式记录一次重大架构决策的短文档,是架构可追溯与演进的关键实践。
质量属性(Quality Attribute):系统的非功能特性,如性能、可用性、可维护性、安全性等,是架构设计的核心约束(见 第 5 章 ISO 25010)。
KA(Knowledge Area,知识领域):SWEBOK 划分学科内容的独立主题单元,见 第 3 章。

4.2 关键判断标准

代码摆放与职责划分是横跨 Design 与 Construction 的过渡地带:包的大结构(按业务域 vs 按技术层)属于架构/设计决策;单个 controller / service / repository 内部的写法属于编码规范。

4.3 业界主流的代码组织与职责划分流派

业界对"代码怎么摆、职责怎么分"的分类,按架构风格划分如下。这些流派既决定了目录摆放,也决定了职责划分方式。

流派代码摆放职责划分适用场景
分层架构(Layered)按技术层:controller / service / repository每层一种技术职责,上层依赖下层传统单体、大多数业务系统
包按业务域(Package by Feature)按业务模块:order / user / payment模块内自包含 controller+service+repo,内聚高中大型系统,业界主流趋势
六边形架构(Hexagonal)domain / application / infrastructure领域核心不依赖外部,端口+适配器接外部需隔离框架、便于测试的系统
整洁架构(Clean Architecture)entities / usecases / adapters / frameworks依赖只指向内层,内层不知道外层存在复杂业务、长期演进的核心系统
MVC / MVVM前端:views / controllers / models(或 stores)视图、控制、模型分离Web 与移动端 UI 层
DDD(限界上下文)按限界上下文划分模块,内部四层领域模型驱动,聚合维护业务不变量复杂业务领域(见 DDD 文档)
PlantUML diagram
架构·设计·编码 三层定位及知识领域归属(结构图:组件图)

演示:同一功能在三层分别如何呈现

// 架构层(KA2)——系统级边界:模块间只通过接口调用
[订单服务] -->|REST| [支付服务]      // 同步接口
[订单服务] -->|事件|  [库存服务]      // 异步解耦

// 详细设计层(KA3)——单个模块内部的设计
class OrderService {
  private final OrderRepository repo;   // 依赖抽象接口
  public Order create(OrderCmd cmd) {   // 业务编排
    Order o = new Order(cmd);
    repo.save(o);
    eventBus.publish(new OrderCreated(o.getId()));
    return o;
  }
}

// 编码规范层(KA4)——命名、目录摆放、职责划分
app/order/
├── controller/    OrderController   // 只收请求、转发,不含业务
├── service/       OrderService      // 业务逻辑编排
├── repository/    OrderRepository   // 只管持久化
└── dto/           OrderCreateCmd    // 入参传输对象

4.4 权威标准与知识体系

资料定位说明
SWEBOK V4.0(IEEE CS, 2024)知识体系总纲18 个 KA 定义软件工程边界,www.swebok.org 免费获取
IEEE Std 610-1990术语标准权威定义 architecture / design / construction 等术语
IEEE Std 42010架构描述标准软件架构的"视图-视角-关切点"(Viewpoints and Views)国际标准
ISO/IEC/IEEE 12207 / 15288生命周期过程软件/系统生命周期过程框架(见 第 2 章)
ISO/IEC 25010质量模型软件质量的 8 大特性(见 第 5 章)

4.5 经典书籍

书籍作者/年份覆盖层面
《Software Engineering》10thSommerville, 2016全书总纲,软件工程全景
《Software Architecture in Practice》Bass / Clements / Kazman架构设计与质量属性
《Documenting Software Architectures》Clements et al.架构文档化(视图方法)
《Clean Architecture》Robert C. Martin, 2017整洁架构、依赖规则
《Design Patterns》(GoF)Gamma et al., 1994设计模式与复用
《Code Complete》2ndMcConnell, 2004编码规范与构建细节
《Domain-Driven Design》Eric Evans, 2003DDD 战略+战术设计
《The Unified Modeling Language User Guide》Booch / Rumbaugh / JacobsonUML 建模(本馆另有 UML 详解)

4.6 经典论文(按时间)

论文作者/年份贡献
"On the Criteria To Be Used in Decomposing Systems into Modules"Parnas, 1972信息隐藏与模块划分——模块化理论源头,架构设计的基石
"No Silver Bullet"Brooks, 1986软件复杂度本质,说明工程化并非银弹
"Class-Responsibility-Collaboration Cards (CRC)"Beck & Cunningham, 1989职责划分的协作建模方法
"ATAM: Method for Architecture Evaluation"Kazman et al., 2000架构权衡分析方法,架构质量评估标准方法
"Out of the Tar Pit"Moseley & Marks, 2006复杂度本质与简单设计/函数式范式

4.7 历史脉络

年份事件意义
1968NATO 软件工程会议"软件工程"术语诞生,软件危机被正式提出
1972Parnas 模块化论文确立"信息隐藏+模块划分"的架构设计基石
1970s-80s结构化方法(Yourdon、Jackson)从"编程手艺"走向"软件方法"
1994GoF 设计模式对象设计与职责划分的范式
1997UML 1.0 标准发布统一建模语言成为业界标准
2001敏捷宣言轻流程、拥抱变化
2003DDD(Evans)复杂领域的模型驱动方法
2017《Clean Architecture》架构分层与依赖规则的集大成
2024SWEBOK V4.018 个知识领域的现行权威框架

4.8 不同软件类型的架构·设计·编码差异

前几节给出的"架构/设计/编码三层"定义是通用骨架。但软件分很多类型——底层/系统软件、中间件、业务系统、开发工具、框架/库,面向的用户完全不同,三层的约束来源也因此不同:架构"怎么拆"的依据、设计"怎么做"的约束、编码"怎么写"的底线,由不同类型软件的决定性因素支配,不可能用同一套规范(分类见 1.3)。

层面底层/系统软件中间件/基础设施开发工具框架/库业务系统/应用软件
架构
(怎么拆)
拆的依据是硬件:内存映射、总线、中断、实时性、无 OS/RTOS,资源受限直接框死边界拆的依据是协议与性能:核心引擎+插件/模块化(nginx 模块、redis 命令集)、主从/分片/哨兵/集群高可用、master-worker 进程模型拆的依据是用户工作流:极简内核+插件、CLI 入口、Unix 管道哲学、启动快拆的依据是复用者生态:开放-封闭、SPI/扩展点、依赖倒置,SemVer 兼容本身是架构决策拆的依据是业务域:DDD 限界上下文、微服务、演进式架构,关注可扩展与可用性
设计
(怎么做)
状态机、寄存器级数据流、手动内存管理、无 GC、无堆分配约束非阻塞 I/O(Reactor/epoll)、协议解析(HTTP/Redis Protocol)、存储引擎与一致性模型、缓存/淘汰策略命令/API 尽量少而清晰、数据格式(JSON/YAML)即接口API 设计是一等公民:泛型/类型系统设计、扩展点设计、弃用(Deprecation)策略对象设计、事务边界、事件驱动、CQRS、设计模式
编码
(怎么写)
MISRA C、禁止动态内存/递归、静态分析强制、体积与性能优先高性能 C/C++/Go、内存管理与零拷贝、基准/压测驱动、严谨变更控制精简依赖、标准库优先、错误信息与帮助文档当产品做向后兼容是红线、弃用流程、文档即规范、注释即示例可读性优先、命名规范、评审+覆盖率门槛、重构文化、适度抽象
约束来源总结:同一句"架构 = 系统怎么拆",但底层靠硬件拆、中间件靠协议与性能拆、开发工具靠用户工作流拆、框架靠复用者生态拆、业务系统靠业务域拆。第 4.1 节的三层定义是"骨架",本表是"骨架在不同类型软件里的具体化"。

5. 质量保证与度量

5.1 软件质量模型(ISO/IEC 25010)

国际标准 ISO/IEC 25010 定义了软件质量的 8 大特性:

特性含义典型子特性
功能适合性 Functional Suitability满足用户需求的程度功能完整性、正确性、适当性
性能效率 Performance Efficiency资源与时间消耗吞吐量、响应时间、资源利用率
兼容性 Compatibility与其他系统协作共存性、互操作性
易用性 Usability易学易用程度可学习性、可操作性、可访问性
可靠性 Reliability在条件下维持性能水平可用性、容错、可恢复性
安全性 Security防护数据与系统机密性、完整性、可追溯性
可维护性 Maintainability可被修改的程度模块化、可测试性、可分析性
可移植性 Portability在环境中迁移适应性、可安装性、可替换性

5.2 测试层次(Test Levels)

5.3 常用度量指标

指标含义良好基准(参考)
代码覆盖率 Coverage测试执行覆盖的代码比例语句覆盖 ≥ 80%
缺陷密度 Defect Density每千行代码缺陷数< 5 个/KLOC(成熟产品)
缺陷修复率 Bug Resolution已修复缺陷占比随发布趋近 100%
MTBF(平均无故障时间)可靠性指标依系统而定
循环时间 Cycle Time从需求到上线的时间持续缩短
变更失败率 Change Failure Rate上线后导致故障的变更比例< 15%(DevOps 标杆)
专有名词解释
MTBF(Mean Time Between Failures,平均无故障时间):系统两次故障之间的平均间隔时间,是可靠性关键指标。
MTTR(Mean Time To Repair,平均修复时间):从故障发生到恢复的平均耗时。
UAT(User Acceptance Testing,用户验收测试):最终用户确认系统满足业务目标的测试阶段。

5.4 不同软件类型的质量属性优先级与规范裁剪

ISO 25010 的 8 大特性对所有软件都适用,但面向的用户不同,特性优先级排序就不同(分类见 1.3)——"哪个质量特性排第一"决定了工程规范的强度与侧重。ISO/IEC/IEEE 12207 本身也明确允许裁剪(Tailoring),即每个组织/项目按自身情况增删过程,这是"规范因软件类型而异"的标准依据。

类型用户第一优先级质量属性典型规范差异
底层/系统软件
(OS/驱动/嵌入式)
机器 / 硬件可靠性、性能、安全性V 模型/瀑布、MISRA C、严格认证(DO-178C)、长维护周期
中间件/基础设施
(nginx/redis/Kafka)
其他软件系统(运行时依赖)性能效率、可靠性、可用性(一致性)高可用集群/SRE、协议兼容红线、滚动升级/灰度发布、长维护周期
开发工具
(CLI/IDE/DevOps 工具)
开发者易用性、性能效率快速迭代、插件生态、脚本/API 优先
框架/库开发者(复用者)兼容性、可维护性SemVer 版本治理、API 稳定性、向后兼容、文档与社区治理
业务系统/应用软件
(ERP/电商/中后台)
企业内部 / 终端消费者功能适合性、可维护性敏捷+DevOps、分层架构/DDD、需求变更管理
Tailoring(裁剪):ISO/IEC/IEEE 12207 允许组织与项目对过程框架进行增删调整,是"规范随软件类型/领域而异"的标准化依据。SWEBOK 是"公分母",第 4.8 节的约束来源与本节的质量属性排序是"分水岭"。

6. 行为图(系统"做什么")

行为图描述软件工程中人、团队、流程"做什么"。先以用例图纵览整体行为,再以活动图、时序图、状态机图逐步细化核心主流程。

6.1 用例图——软件工程整体行为

用例图展示软件工程中各方角色参与的活动。客户与产品经理定义需求,架构师设计结构,开发者编码,测试者验证,运维保障上线,管理者统筹全局。

PlantUML diagram
软件工程整体用例图——各角色的职责与活动依赖

演示:用用户故事(User Story)表达一个用例的验收标准

// 用例 UC1 "收集与分析需求" 的用户故事形式
As a 注册用户,
I want 用手机号+验证码登录,
So that 我可以快速安全地访问系统.

验收标准 (Acceptance Criteria):
- 输入正确手机号与验证码后 3 秒内登录成功
- 验证码 5 分钟内有效且只能使用一次
- 连续 5 次输错后锁定 30 分钟

6.2 活动图——软件生命周期完整主流程

活动图用泳道展示从需求提出到上线运营的完整流程:需求分析→架构设计→迭代开发→测试→发布→监控→反馈,形成持续改进的闭环。

PlantUML diagram
软件生命周期活动图(带泳道,含 CI/CD 与迭代闭环)

演示:CI 流水线配置(GitHub Actions)——把活动图中的"构建-测试-发布"自动化

name: CI
on:
  push:
    branches: [main]
jobs:
  build-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run lint
      - run: npm test -- --coverage
      - run: npm run build

6.3 时序图——敏捷 Scrum Sprint 迭代

时序图刻画一个典型 Scrum 迭代中,产品负责人、开发者、测试、CI/CD 平台与生产环境之间的消息协作时序。

PlantUML diagram
Scrum Sprint 迭代时序图——从计划会到发布确认

演示:一个 Sprint(2 周)的节奏安排

Sprint 周期节奏(Scrum 仪式):
  Day 1   : Sprint Planning  计划会(明确目标与待办)
  Daily   : Daily Standup    每日站会(15 分钟同步障碍)
  Day 8   : Backlog Refinement 待办梳理
  Day 10  : Sprint Review    评审会(演示可运行成果)
  Day 10  : Retrospective    回顾会(改进过程)
  Day 10  : Release          通过验收后发布

6.4 状态机图——缺陷(Defect)生命周期

状态机图描述软件工程中最典型的工件之一——缺陷从发现到关闭的状态流转,是配置管理与质量管理的基础。

PlantUML diagram
缺陷(Defect)生命周期状态机图

演示:缺陷实体状态字段(JSON 形态)

{
  "id": "BUG-1042",
  "title": "订单页在 iOS 下白屏",
  "severity": "High",            // Blocker/High/Medium/Low
  "status": "Fixed",             // New/Open/Fixed/Verified/Closed/Reopened
  "steps": ["打开首页", "点击下单", "观察白屏"],
  "reporter": "qa.wang",
  "assignee": "dev.li",
  "foundIn": "v1.4.0-rc1",
  "fixedIn": "v1.4.0-rc2"
}

7. 结构图(系统"由什么组成")

结构图描述软件工程"由什么组成":从部署环境的物理拓扑(部署图),到软件产品内部组件(组件图),再到学科层面的过程包结构(包图),最后到核心概念实体关系(类图),由宏观到细节逐层细化。

7.1 部署图——软件交付部署拓扑

部署图展示软件从代码提交到生产上线的物理节点:开发者工作站→代码托管→CI/CD 服务器→制品仓库→测试环境→生产环境,及监控观测。

PlantUML diagram
软件交付部署图——开发到生产的制品流转

演示:生产环境部署清单(Docker Compose 片段)

version: "3.8"
services:
  gateway:   { image: myapp/gateway:1.4.0, ports: ["80:8080"] }
  app:       { image: myapp/app:1.4.0,   depends_on: [db, cache] }
  cache:     { image: redis:7 }
  db:        { image: postgres:16, volumes: ["pgdata:/var/lib/postgresql/data"] }
  monitor:   { image: prom/prometheus, ports: ["9090:9090"] }

7.2 组件图——现代软件系统组件

组件图展示典型现代软件系统(如微服务应用)的内部组成与依赖关系:前端、网关、业务服务、数据存储、缓存、消息、可观测性与安全。

PlantUML diagram
现代软件系统组件架构图

演示:服务间依赖的接口声明(REST 风格)

# 订单服务提供的接口
GET    /orders?user={uid}         查询订单列表
POST   /orders                    创建订单
POST   /orders/{id}/pay           发起支付

# 订单服务消费的接口
POST   /payments/{orderId}        调用支付服务
GET    /inventory/{sku}           查询库存服务
PUB    /order/created             发布订单创建事件

7.3 包图——软件工程过程体系(ISO 12207)

包图用国际标准 ISO/IEC/IEEE 12207 的四组过程展示软件工程"由哪些过程构成",以及技术过程的递进依赖关系。

PlantUML diagram
软件工程过程体系包图(ISO/IEC/IEEE 12207)

演示:一个典型项目的工程目录(对应包图中的过程产物)

my-service/
├── docs/
│   ├── srs.md                 # 需求规格 (Requirements)
│   ├── architecture.md        # 架构设计 (Architecture Design)
│   └── design.md              # 详细设计 (Design)
├── src/                       # 实现 (Implementation)
├── test/                      # 测试 (Verification)
├── ci/                        # 流水线定义 (Engineering Operations)
├── scripts/                   # 部署脚本 (Operations)
└── CHANGELOG.md               # 配置与发布管理 (SCM)

7.4 类图——软件工程核心概念模型

类图刻画软件工程领域内的核心实体及其关系:项目、干系人、需求、用例、设计文档、代码模块、测试用例、缺陷、构建、发布。

PlantUML diagram
软件工程核心概念类图

演示:核心实体示例(TypeScript 接口形态)

interface Requirement {
  id: string;
  description: string;
  priority: 'P0' | 'P1' | 'P2';
  acceptanceCriteria: string[];
}

interface Defect {
  id: string;
  requirementId: string;   // 关联需求 (traced to)
  testCaseId?: string;     // 关联测试用例 (finds)
  severity: 'High' | 'Medium' | 'Low';
  status: 'New' | 'Open' | 'Fixed' | 'Closed' | 'Reopened';
}

interface Release {
  version: string;         // 语义化版本, 如 "1.4.0"
  buildNumber: number;     // 关联构建
  requirements: string[];  // 满足的需求 (satisfies)
  releaseDate: Date;
}

8. 实战速查手册

8.1 生命周期模型选择速查

场景特征推荐模型
需求明确稳定、流程受监管瀑布 / V 模型
需求不确定、变化频繁敏捷 Scrum / 迭代增量
高风险大型项目螺旋模型
需要高频可靠发布DevOps / 持续交付
安全关键系统V 模型 + 严格验证

8.2 各阶段核心交付物速查

阶段交付物质量检查点
需求SRS、用户故事、原型需求评审、可追踪性矩阵
架构/设计架构文档、设计图、接口定义架构评审、ADR 记录
实现源码、单元测试、代码评审记录覆盖率、静态检查、CI 通过
测试测试计划、用例、缺陷报告缺陷收敛、回归通过、UAT 通过
发布版本产物、变更说明、发布计划发布检查单、回滚预案
运维监控面板、日志、SLO 报告告警响应、SLO 达成率

8.3 常用工具速查

类别工具
版本控制 / SCMGit、SVN、GitHub、GitLab、Bitbucket
项目与需求管理Jira、Trello、Linear、禅道
CI/CDJenkins、GitHub Actions、GitLab CI、ArgoCD
测试JUnit、pytest、Selenium、Cypress、Postman、SonarQube
构建/包管理Maven、Gradle、npm、pip、Docker、Harbor
运维监控Prometheus、Grafana、ELK、SkyWalking、Kubernetes
协作沟通Confluence、Slack、飞书、钉钉

8.4 质量指标速查

指标建议值用途
语句覆盖率≥ 80%测试充分度
缺陷密度< 5/KLOC代码质量
变更失败率< 15%发布稳定性
循环时间持续下降交付效率
SLO 达成率≥ 99.9%服务可靠性

8.5 研发最佳实践 Checklist

  1. 先写测试再写代码(TDD)或至少保证核心逻辑有自动化测试。
  2. 小步提交、频繁合并到主干,避免长分支。
  3. 每次提交触发 CI,编译、测试、静态检查全自动。
  4. 代码评审作为合并硬性门槛。
  5. 需求可追踪:从用户故事到代码到测试到发布的链条完整。
  6. 语义化版本(SemVer:MAJOR.MINOR.PATCH)管理发布。
  7. 发布有回滚预案,配置与代码分离。
  8. 监控告警前置:上线即有日志、指标、告警。
  9. 定期回顾改进过程(Retrospective)。
  10. 安全左移(Shift-Left):依赖扫描、安全测试在 CI 中尽早执行。